{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\Anaconda\\envs\\gnn\\lib\\site-packages\\tqdm\\auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "from loss import weighted_loss\n",
    "from model import Att_Gnn\n",
    "from torch_geometric.loader import DataLoader\n",
    "from util import generate_data, num_of_l\n",
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx\n",
    "import numpy as np\n",
    "import torch\n",
    "\n",
    "G = nx.barabasi_albert_graph(1000, 2)\n",
    "dataset = generate_data(0.04, 0.08, G)\n",
    "batch_size = 1\n",
    "data_iter = DataLoader(dataset, batch_size=batch_size, drop_last=True)  # 批量训练\n",
    "\n",
    "model = Att_Gnn()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "ename": "RuntimeError",
     "evalue": "Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument index in method wrapper__index_select)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
      "\u001b[1;32me:\\QQDownload\\大创\\新冠疫情预测\\代码\\mix\\covid_-gnn\\web\\AttGnn\\fig_1.ipynb Cell 2\u001b[0m in \u001b[0;36m<cell line: 6>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     <a href='vscode-notebook-cell:/e%3A/QQDownload/%E5%A4%A7%E5%88%9B/%E6%96%B0%E5%86%A0%E7%96%AB%E6%83%85%E9%A2%84%E6%B5%8B/%E4%BB%A3%E7%A0%81/mix/covid_-gnn/web/AttGnn/fig_1.ipynb#W1sZmlsZQ%3D%3D?line=10'>11</a>\u001b[0m out \u001b[39m=\u001b[39m model(data)\n\u001b[0;32m     <a href='vscode-notebook-cell:/e%3A/QQDownload/%E5%A4%A7%E5%88%9B/%E6%96%B0%E5%86%A0%E7%96%AB%E6%83%85%E9%A2%84%E6%B5%8B/%E4%BB%A3%E7%A0%81/mix/covid_-gnn/web/AttGnn/fig_1.ipynb#W1sZmlsZQ%3D%3D?line=12'>13</a>\u001b[0m loss_func \u001b[39m=\u001b[39m weighted_loss(data\u001b[39m.\u001b[39medge_index, \u001b[39m0.5\u001b[39m)\n\u001b[1;32m---> <a href='vscode-notebook-cell:/e%3A/QQDownload/%E5%A4%A7%E5%88%9B/%E6%96%B0%E5%86%A0%E7%96%AB%E6%83%85%E9%A2%84%E6%B5%8B/%E4%BB%A3%E7%A0%81/mix/covid_-gnn/web/AttGnn/fig_1.ipynb#W1sZmlsZQ%3D%3D?line=13'>14</a>\u001b[0m loss \u001b[39m=\u001b[39m loss_func(out, data)\n\u001b[0;32m     <a href='vscode-notebook-cell:/e%3A/QQDownload/%E5%A4%A7%E5%88%9B/%E6%96%B0%E5%86%A0%E7%96%AB%E6%83%85%E9%A2%84%E6%B5%8B/%E4%BB%A3%E7%A0%81/mix/covid_-gnn/web/AttGnn/fig_1.ipynb#W1sZmlsZQ%3D%3D?line=14'>15</a>\u001b[0m loss\u001b[39m.\u001b[39mbackward()\n\u001b[0;32m     <a href='vscode-notebook-cell:/e%3A/QQDownload/%E5%A4%A7%E5%88%9B/%E6%96%B0%E5%86%A0%E7%96%AB%E6%83%85%E9%A2%84%E6%B5%8B/%E4%BB%A3%E7%A0%81/mix/covid_-gnn/web/AttGnn/fig_1.ipynb#W1sZmlsZQ%3D%3D?line=15'>16</a>\u001b[0m optimizer\u001b[39m.\u001b[39mstep()\n",
      "File \u001b[1;32me:\\Anaconda\\envs\\gnn\\lib\\site-packages\\torch\\nn\\modules\\module.py:1110\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *input, **kwargs)\u001b[0m\n\u001b[0;32m   1106\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m   1107\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m   1108\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m   1109\u001b[0m         \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1110\u001b[0m     \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49m\u001b[39minput\u001b[39;49m, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[0;32m   1111\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[0;32m   1112\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n",
      "File \u001b[1;32me:\\QQDownload\\大创\\新冠疫情预测\\代码\\mix\\covid_-gnn\\web\\AttGnn\\loss.py:34\u001b[0m, in \u001b[0;36mweighted_loss.forward\u001b[1;34m(self, out, data)\u001b[0m\n\u001b[0;32m     32\u001b[0m x \u001b[39m=\u001b[39m data\u001b[39m.\u001b[39mx\n\u001b[0;32m     33\u001b[0m y \u001b[39m=\u001b[39m data\u001b[39m.\u001b[39my\u001b[39m.\u001b[39mlong()\n\u001b[1;32m---> 34\u001b[0m w \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mweight(x)\u001b[39m.\u001b[39mto(\u001b[39m\"\u001b[39m\u001b[39mcuda\u001b[39m\u001b[39m\"\u001b[39m \u001b[39mif\u001b[39;00m torch\u001b[39m.\u001b[39mcuda\u001b[39m.\u001b[39mis_available() \u001b[39melse\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39mcpu\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m     35\u001b[0m w \u001b[39m/\u001b[39m\u001b[39m=\u001b[39m w\u001b[39m.\u001b[39msum()\n\u001b[0;32m     37\u001b[0m out \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mclamp(out, \u001b[39m1e-15\u001b[39m, \u001b[39m1\u001b[39m \u001b[39m-\u001b[39m \u001b[39m1e-15\u001b[39m)\n",
      "File \u001b[1;32me:\\QQDownload\\大创\\新冠疫情预测\\代码\\mix\\covid_-gnn\\web\\AttGnn\\loss.py:44\u001b[0m, in \u001b[0;36mweighted_loss.weight\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m     42\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mweight\u001b[39m(\u001b[39mself\u001b[39m, x):\n\u001b[0;32m     43\u001b[0m     x_state \u001b[39m=\u001b[39m x\u001b[39m.\u001b[39mview(\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m)\u001b[39m.\u001b[39mto(torch\u001b[39m.\u001b[39mlong)\n\u001b[1;32m---> 44\u001b[0m     infected_neighbors \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mi_n(x, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49medge_index)\u001b[39m.\u001b[39mview(\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m)\u001b[39m.\u001b[39mto(torch\u001b[39m.\u001b[39mlong)\n\u001b[0;32m     46\u001b[0m     config \u001b[39m=\u001b[39m \u001b[39mlist\u001b[39m(\n\u001b[0;32m     47\u001b[0m         \u001b[39mmap\u001b[39m(\n\u001b[0;32m     48\u001b[0m             \u001b[39mlambda\u001b[39;00m x: \u001b[39mtuple\u001b[39m(x),\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m     55\u001b[0m         )\n\u001b[0;32m     56\u001b[0m     )\n\u001b[0;32m     58\u001b[0m     pr \u001b[39m=\u001b[39m Counter(config)\n",
      "File \u001b[1;32me:\\Anaconda\\envs\\gnn\\lib\\site-packages\\torch\\nn\\modules\\module.py:1110\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *input, **kwargs)\u001b[0m\n\u001b[0;32m   1106\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m   1107\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m   1108\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m   1109\u001b[0m         \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1110\u001b[0m     \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49m\u001b[39minput\u001b[39;49m, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[0;32m   1111\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[0;32m   1112\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n",
      "File \u001b[1;32me:\\QQDownload\\大创\\新冠疫情预测\\代码\\mix\\covid_-gnn\\web\\AttGnn\\loss.py:14\u001b[0m, in \u001b[0;36mi_neighbor.forward\u001b[1;34m(self, x, edge_index)\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39mself\u001b[39m, x, edge_index):\n\u001b[1;32m---> 14\u001b[0m     \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mpropagate(edge_index, x\u001b[39m=\u001b[39;49mx)\n",
      "File \u001b[1;32me:\\Anaconda\\envs\\gnn\\lib\\site-packages\\torch_geometric\\nn\\conv\\message_passing.py:309\u001b[0m, in \u001b[0;36mMessagePassing.propagate\u001b[1;34m(self, edge_index, size, **kwargs)\u001b[0m\n\u001b[0;32m    306\u001b[0m     \u001b[39mfor\u001b[39;00m arg \u001b[39min\u001b[39;00m decomp_args:\n\u001b[0;32m    307\u001b[0m         kwargs[arg] \u001b[39m=\u001b[39m decomp_kwargs[arg][i]\n\u001b[1;32m--> 309\u001b[0m coll_dict \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__collect__(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__user_args__, edge_index,\n\u001b[0;32m    310\u001b[0m                              size, kwargs)\n\u001b[0;32m    312\u001b[0m msg_kwargs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39minspector\u001b[39m.\u001b[39mdistribute(\u001b[39m'\u001b[39m\u001b[39mmessage\u001b[39m\u001b[39m'\u001b[39m, coll_dict)\n\u001b[0;32m    313\u001b[0m \u001b[39mfor\u001b[39;00m hook \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_message_forward_pre_hooks\u001b[39m.\u001b[39mvalues():\n",
      "File \u001b[1;32me:\\Anaconda\\envs\\gnn\\lib\\site-packages\\torch_geometric\\nn\\conv\\message_passing.py:202\u001b[0m, in \u001b[0;36mMessagePassing.__collect__\u001b[1;34m(self, args, edge_index, size, kwargs)\u001b[0m\n\u001b[0;32m    200\u001b[0m         \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(data, Tensor):\n\u001b[0;32m    201\u001b[0m             \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__set_size__(size, dim, data)\n\u001b[1;32m--> 202\u001b[0m             data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__lift__(data, edge_index, dim)\n\u001b[0;32m    204\u001b[0m         out[arg] \u001b[39m=\u001b[39m data\n\u001b[0;32m    206\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(edge_index, Tensor):\n",
      "File \u001b[1;32me:\\Anaconda\\envs\\gnn\\lib\\site-packages\\torch_geometric\\nn\\conv\\message_passing.py:172\u001b[0m, in \u001b[0;36mMessagePassing.__lift__\u001b[1;34m(self, src, edge_index, dim)\u001b[0m\n\u001b[0;32m    170\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(edge_index, Tensor):\n\u001b[0;32m    171\u001b[0m     index \u001b[39m=\u001b[39m edge_index[dim]\n\u001b[1;32m--> 172\u001b[0m     \u001b[39mreturn\u001b[39;00m src\u001b[39m.\u001b[39;49mindex_select(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mnode_dim, index)\n\u001b[0;32m    173\u001b[0m \u001b[39melif\u001b[39;00m \u001b[39misinstance\u001b[39m(edge_index, SparseTensor):\n\u001b[0;32m    174\u001b[0m     \u001b[39mif\u001b[39;00m dim \u001b[39m==\u001b[39m \u001b[39m1\u001b[39m:\n",
      "\u001b[1;31mRuntimeError\u001b[0m: Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument index in method wrapper__index_select)"
     ]
    }
   ],
   "source": [
    "model.train()\n",
    "\n",
    "optimizer = torch.optim.RAdam(\n",
    "    model.parameters(), betas=(0.9, 0.999), eps=4.0e-4, lr=1e-3, weight_decay=1.0e-4\n",
    ")\n",
    "for epoch in range(10):\n",
    "    loss_avg = 0\n",
    "    count = 0\n",
    "    for data in data_iter:\n",
    "        optimizer.zero_grad()\n",
    "        out = model(data)\n",
    "\n",
    "        loss_func = weighted_loss(data.edge_index, 0.5)\n",
    "        loss = loss_func(out, data)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        loss_avg += loss\n",
    "        count += 1\n",
    "    loss_avg /= count\n",
    "    print(loss_avg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "trans_pro = {}\n",
    "with torch.no_grad():\n",
    "    for item in dataset:\n",
    "        l = num_of_l()(item)\n",
    "        ltp = model(item)\n",
    "        temp = dict(\n",
    "            map(\n",
    "                lambda x: (\n",
    "                    (x[0].to(torch.long).item(), x[1].to(torch.long).item()),\n",
    "                    x[2].tolist(),\n",
    "                ),\n",
    "                zip(item.x, l, ltp),\n",
    "            )\n",
    "        )\n",
    "        trans_pro.update(temp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(7, 5))\n",
    "S_I_l = []\n",
    "S_I_p = []\n",
    "I_S_l = []\n",
    "I_S_p = []\n",
    "\n",
    "for i in range(60):\n",
    "    if (0, i) in trans_pro:\n",
    "        S_I_l.append(i)\n",
    "        S_I_p.append(trans_pro[(0, i)][1])\n",
    "    if (1, i) in trans_pro:\n",
    "        I_S_l.append(i)\n",
    "        I_S_p.append(trans_pro[(1, i)][0])\n",
    "\n",
    "ground_x = np.arange(0, 60)\n",
    "ground_I = 1 - (1 - 0.04) ** ground_x\n",
    "ax.plot(S_I_l, S_I_p, label=\"gnn_S_to_I\")\n",
    "ax.plot(ground_x, ground_I, label=\"gound_truth\")\n",
    "ax.plot(I_S_l, I_S_p, label=\"gnn_I_to_S\")\n",
    "ax.set_xlabel(\"number of infected neighbors\", fontsize=12)\n",
    "ax.set_ylabel(\"transition probability\", fontsize=12)\n",
    "ax.set_title(\"Simple\", fontsize=15)\n",
    "ax.legend()\n",
    "fig.savefig(\"./images/trans_prob.svg\", format=\"svg\")\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.9.13 ('dynalearn')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "0c61c7e70abdc191c04ccd6f6f9fbe1bf9c4f458551ead8250184168ad6fc034"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
